//测试 pthread_cancel函数

#include <stdio.h>
#include <pthread.h>
#include <error.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

void * start_routine(void* args)
{
    //线程的默认取消类型 取消状态 为 enable 和 deferred（延期的）就是会在下一个取消点时响应
    int oldstatus;
    // pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstatus);
    
    // sleep(10);
    // pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstatus);

    sleep(3);
    //异步不需要等待下一个取消点接到信号立即取消
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldstatus);

    // for(;;)
    // {
    //     sleep(1);
    // }
    return NULL;
}

int main()
{
    //创建新线程
    pthread_t tid;
    int err = pthread_create(&tid, NULL, start_routine, NULL);
    if(err)
    {
        fprintf(stderr, "pthread_create failed");
        pthread_exit(NULL);
    }

    //让子进程先跑
    // sleep(3);

    err = pthread_cancel(tid);  //发送取消请求
    if(err)
    {
        fprintf(stderr, "pthread_cancle failed");
        pthread_exit(NULL);
    }
    //使用pthread_join 返回值查看是否响应请求。唯一的方式
    void* retval;
    pthread_join(tid, (void**)&retval);
    if(retval == PTHREAD_CANCELED)
    {
        printf("0x%lx cancled\n", tid);
    }
    return 0;
}